package com.regent.central.bill.repository.mrp;

import com.regent.central.bill.core.mrp.BillMaterialArrive;
import com.regent.central.bill.repository.mrp.dto.MaterialArriveDTO;
import com.regent.central.bill.repository.mrp.dto.arrive.*;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.common.Mapper;

import java.time.LocalDateTime;
import java.util.List;

@Repository
public interface BillMaterialArriveMapper extends Mapper<BillMaterialArrive> {

    /**
     * 统计某个组织在某个时间段内的到料单数量
     *
     * @param unitId    组织ID
     * @param dateStart 时间段
     * @param dateEnd   时间段
     * @return 到料单数量
     */
    int countBillArriveByUnitId(@Param("unitId") String unitId, @Param("dateStart") LocalDateTime dateStart, @Param("dateEnd") LocalDateTime dateEnd);

    /**
     * 查询到料单详情
     *
     * @param billMaterialArriveId 到料单ID
     * @return 到料单详情
     */
    BillMaterialArriveDetailDTO getDetail(String billMaterialArriveId);

    /**
     * 查询组织层到料单号
     * @param unitId
     * @return
     */
    List<String> findOrderNosByUnitId(String unitId);

    List<ArriveDetailSkuDTO> listArriveActionDetail(String billMaterialArriveId);

    List<ActionCheckShrunkDTO> listCheckShrunks(String billMaterialArriveId);

    List<MaterialSkuCSDTO> csMaterialSku(String billMaterialArriveId);

    /**
     * 撤销验布
     */
    int undoCheck(@Param("billMaterialArriveId") String billMaterialArriveId, @Param("materialSkuId") String materialSkuId);

    String getCheckArriveStockChangeId(@Param("billMaterialArriveId") String billMaterialArriveId, @Param("materialSkuId") String materialSkuId);

    /**
     * 撤销缩布
     */
    int undoShrunk(@Param("billMaterialArriveId") String billMaterialArriveId, @Param("materialSkuId") String materialSkuId);

    String getShrunkArriveStockChangeId(@Param("billMaterialArriveId") String billMaterialArriveId, @Param("materialSkuId") String materialSkuId);

    /**
     * 查询到料单的ids  list
     */
    List<String> listBillMaterialsArriveIds(BillMaterialArriveQueryDTO billMaterialArriveQueryDTO);

    /**
     * 到料单导出Excel
     * @param billMaterialArriveQueryDTO
     * @return
     */
    List<MaterialArriveDTO> arriveExcel(BillMaterialArriveQueryDTO billMaterialArriveQueryDTO);

    /**
     * 根据到料单ids查询到料单信息列表
     */
    List<MaterialArriveDTO> listMaterialArriveByBillArriveIds(@Param("billMaterialArriveIds") List<String> billMaterialArriveIds);

    /**
     * 撤销到料单
     */
    int undoBill(String billMaterialArriveId);

    /**
     * 撤销到料动作
     */
    int undoAction(String billMaterialArriveId);

    List<BillArriveUndoMissionSkuDTO> listArriveQuantity(String billMaterialArriveId);

    /**
     * 关联库存变动记录
     *
     * @param billMaterialArriveId 到料单ID
     * @param stockChangeId        库存变动记录ID
     * @return 影响条数
     */
    int relationStockChange(@Param("billMaterialArriveId") String billMaterialArriveId, @Param("stockChangeId") String stockChangeId);

    /**
     * 获取到料单关联的库存变动记录
     *
     * @param billMaterialArriveId 到料单ID
     * @return 库存
     */
    String getStockChangeId(String billMaterialArriveId);

    /**
     * 查询指定的到料单是否有缩布或验布
     *
     * @param billMaterialArriveId  到料单ID
     */
    boolean hasCheckShrunked(String billMaterialArriveId);

    /**
     * 查询指定的采购单是否有到料单
     * @param billMaterialPurchaseId
     * @return
     */
    boolean hasBillMaterialArriveByPurchaseId(String billMaterialPurchaseId);
}